package com.malou.server.ventas.serie;

import java.sql.SQLException;
import java.util.List;

import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.malou.client.ventas.serie.Serie;
import com.malou.client.ventas.serie.TipoDocumento;
import com.malou.server.base.Conexion;
import com.malou.server.base.util.GxtGridPaginate;

public class Series {
	
	public static SqlMapClient sqlMap = null;
	public static Integer errorTipo = 0;
	public static String ultimonumero;
	
	@SuppressWarnings("unchecked")
	public static PagingLoadResult<Serie> getPaginate(GxtGridPaginate paginate){		     
		
		sqlMap = Conexion.getSqlMap();
		paginate.setLimit();
		if(paginate.order.equals("")){
			paginate.order = " order by id desc";
		}
		List<Serie> data = null;
		try {
			data = sqlMap.queryForList("paginateSerie", paginate);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return new BasePagingLoadResult<Serie>(data, paginate.offset, count(paginate));
	}
	
	public static Integer count(GxtGridPaginate paginate){
		Integer count = null;
		try {
			count = (Integer) sqlMap.queryForObject("countSerie", paginate);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}
	
	public static boolean save(Serie cl){
		boolean retorno = true;		  
	
		sqlMap = Conexion.getSqlMap();
		try {
			if(isValid(cl)){
				if(cl.getId() != null)
					sqlMap.update("updateSerie", cl);
				else			
					sqlMap.insert("insertSerie", cl);
			}else
				retorno = false;
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		return retorno;
	}
	
	public static boolean delete(Integer id){
		boolean retorno = true;		     
		
		sqlMap = Conexion.getSqlMap();
		try {
			if(id != null)
				sqlMap.delete("deleteSerie", id);
			else
				retorno = false;
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		return retorno;
	}
	
	public static boolean deleteAll(String ids){
		boolean retorno = true;		 
		
		sqlMap = Conexion.getSqlMap();
		try {
			if(!ids.equals(""))
				sqlMap.delete("deleteSeries", ids);
			else
				retorno = false;
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		return retorno;
	}
	
	@SuppressWarnings("unchecked")
	public static List<TipoDocumento> getTipoDocumento(){		
        SqlMapClient sqlMap = null;
		
		sqlMap = Conexion.getSqlMap();
		
        List<TipoDocumento> data = null;
		try {
			data = sqlMap.queryForList("getTipoDocumento", null);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
        return data;
	}
	
	private static boolean isValid(Serie sr){
		boolean retorno = true;
        Integer cant;
        try {
	        if(sr.getParametro() != null){
	         cant = (Integer)sqlMap.queryForObject("validaParametro", sr);
	             if(cant != 0){
	            	 errorTipo = 1; //"Este parametro ya existe";
	                retorno = false;
	            }
	        }
	        if(retorno)
	        if(sr.getTipodocumento_id() != null && sr.getTienda_id() != null ){
		        cant = (Integer)sqlMap.queryForObject("validaDocumentoTienda", sr);
		        if(cant != 0){
		        	errorTipo = 2 ; //"Esta tienda ya tiene ese documento";
		            retorno = false;
		        }
	        }
        } catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
        return retorno;
	}
	
	public static boolean hasSerie(Integer tienda_id, Integer tipodocumento_id) throws SQLException{
		boolean retorno = true;
		Serie sr = new Serie();
		sr.setTienda_id(tienda_id);
		sr.setTipodocumento_id(tipodocumento_id);
        Integer cant = (Integer)sqlMap.queryForObject("hasSerie", sr);
        if(cant == 0){
            retorno = false;
        }
		
        return retorno;
	}
	public static boolean hasSerieArticulo(String parametro){
		boolean retorno = true;
		try {
	        Integer cant = (Integer)sqlMap.queryForObject("hasSerieArticulo", parametro);
	        if(cant == 0){
	            retorno = false;
	        }
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
        return retorno;
	}
	
	public static String actualizarNumeracion(Integer tienda_id,Integer documento_id) throws SQLException{
        
        String nuevoNumero="";
        Serie numeracion = new Serie();
        
        numeracion.setTienda_id(tienda_id);	        
        numeracion.setTipodocumento_id(documento_id);	        
        numeracion = (Serie)sqlMap.queryForObject("getSerie", numeracion);                
        
        numeracion = completarCeros(numeracion);
        
        sqlMap.update("updateSerie", numeracion);
        
        nuevoNumero = numeracion.getUltimonumero();
        
        if(numeracion.getSerie() != null)
            nuevoNumero = numeracion.getSerie()+"-"+nuevoNumero;        
        
        return nuevoNumero;
    }

    public static String actualizarNumeracion(String parametro){

        String nuevoNumero="";
        Serie numeracion;
        boolean actualiza = true;
        try {
	             
	        numeracion = (Serie)sqlMap.queryForObject("getSerieParametro", parametro);
	        if(ultimonumero != null){
	            if(Integer.parseInt(ultimonumero) <= Integer.parseInt(numeracion.getUltimonumero()))
	                actualiza = false;            
	            
	            numeracion.setUltimonumero(ultimonumero);            
	        }
	        numeracion = completarCeros(numeracion);
	        if(actualiza)
	            sqlMap.update("updateSerie", numeracion);
	        nuevoNumero = numeracion.getUltimonumero();
	        if(numeracion.getSerie() != null)
	            nuevoNumero = numeracion.getSerie()+"-"+nuevoNumero;
        } catch (SQLException e) {			
			e.printStackTrace();			
		}

        return nuevoNumero;
    }
    
    public static Integer getLongitud(String parametro){
    	Serie numeracion = null;
    	try {
			numeracion = (Serie)sqlMap.queryForObject("getSerieParametro", parametro);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return numeracion.getLongitudnumero();
    }

    public static String getNumeracion(String parametro){    	

        String nuevoNumero="";
        Serie numeracion = new Serie();                
		
		sqlMap = Conexion.getSqlMap();
        try {        
	        numeracion.setParametro(parametro);
	        
	        numeracion = (Serie)sqlMap.queryForObject("getSerieParametro", parametro);
	        if(ultimonumero != null)
	        	numeracion.setUltimonumero(ultimonumero);
	        
	        numeracion = completarCeros(numeracion);
	        
	        nuevoNumero = numeracion.getUltimonumero();
	        if(numeracion.getSerie() != null)
	            nuevoNumero = numeracion.getSerie()+"-"+nuevoNumero;
        } catch (SQLException e) {			
			e.printStackTrace();			
		}

        return nuevoNumero;
    }
    
    public static Serie completarCeros(Serie numeracion){
        String numeroStr="";
        Integer numero = Integer.parseInt(numeracion.getUltimonumero());
        if(ultimonumero == null)
            numero++;
        else
        	ultimonumero = null;
        numeroStr = numero.toString();
        Integer longitudNumero = numeroStr.length();
        while(numeracion.getLongitudnumero() - longitudNumero > 0){
            numeroStr = "0"+numeroStr;
            longitudNumero++;
        }
        
        numeracion.setUltimonumero(numeroStr);
        return numeracion;
    }
}